﻿CREATE PROCEDURE [dbo].[InventoryLinesUpdate]
(
	@GoodsId int,
	@PartyId int,
	@DocQntty int,
	@FactQntty int,
	@BarCode char(12),
	@SupplierGoodsId int,
	@ManufacturerPrice decimal(19, 2),
	@SupplierPrice decimal(19, 2),
	@SupplierSumNOTAX decimal(19, 2),
	@ImportMarkup float,
	@SupplierMarkup float,
	@BatchNumber varchar(20),
	@ReadyBefore smalldatetime,
	@MadeDate smalldatetime,
	@NDSTax tinyint,
	@NDSValue decimal(19, 2),
	@ReestrPrice decimal(19, 2),
	@ReestrDate smalldatetime,
	@GTDNumber varchar(30),
	@CertificateNumber varchar(80),
	@CertificateDate smalldatetime,
	@CertificateOrgId int,
	@RetailMarkup float,
	@RetailPrice decimal(19, 2),
	@ContragentId int,
	@ContragentDocDate smalldatetime,
	@ContragentDocNumber varchar(20),
	@Note varchar(250),
	@MD datetime,
	@MW varchar(50),
	@Original_Id int,     --CD.InventoryLines.Id
	@Original_MD datetime --CD.InventoryLines.MD
)
AS	
DECLARE @orgDocId int, @orgDocDate smalldatetime, @orgGoodsId int, @orgPartyId int, @orgPartyDocId int
DECLARE @orgDocQntty int, @orgFactQntty int, @orgRetailPrice decimal(19, 2), @orgInputLineId int
DECLARE @intGoodsDocLineId int, @intDocTypeId int
DECLARE @intInputCount int, @intOutputCount int, @intT int

DECLARE @strMsg nvarchar(500), @intRet int, @intErrCode int, @intRowCount int
--(@PartyId Is Null) OR 
SET NOCOUNT ON
IF (@DocQntty Is Null) OR (@FactQntty Is Null) OR (@PartyId Is Null) OR (@FactQntty Is Null)
BEGIN
	SELECT @intErrCode = 1, @strMsg = 'Неправильные параметры в вызове процедуры ' + Object_Name(@@Procid) + ' !'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF (@DocQntty < 0) OR (@FactQntty < 0)
BEGIN
	SELECT @intErrCode = 2, 
	@strMsg = 'Количество должно быть больше или равно нулю!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @orgDocId = DocId, @orgPartyId = PartyId, @orgPartyDocId = PartyDocId, @orgGoodsId = GoodsId,
@orgDocQntty = DocQntty, @orgFactQntty = FactQntty, @orgRetailPrice = RetailPrice,
@intGoodsDocLineId = GoodsDocLineId, @orgInputLineId = InputLineId
FROM dbo.vwInventoryLines 
WHERE Id = @Original_Id AND MD = @Original_MD
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 4, 
	@strMsg = 'Данные изменены после последнего запроса!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @intDocTypeId = DocTypeId, @orgDocDate = DocDate FROM CA.Documents WHERE Id = @orgDocId

IF (@intDocTypeId <> 6)
BEGIN
	SELECT @intErrCode = 3, @strMsg = 'Неправильный тип документа!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF (@orgDocId = @orgPartyDocId) AND (@DocQntty >= @FactQntty)
BEGIN
	SELECT @intErrCode = 4, @strMsg = 'По строкам, созданным без указания партии, фактическое количество д.б. больше количества по документам!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF (@PartyId <> @orgPartyId)
BEGIN
	SELECT @intErrCode = 5, 
	@strMsg = 'При изменении строки инвентаризационного документа партию менять нельзя!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF (@orgDocId <> @orgPartyDocId) AND (@orgRetailPrice <> @RetailPrice)
BEGIN --партия была создана НЕ по документу инвентаризации и введена новая цена
	SELECT @intErrCode = 6, 
	@strMsg = 'Нельзя менять цену, если партия была создана не по документу инвентаризации!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

EXEC [dbo].[ProcessStatistic] @Note OUTPUT, @MD OUTPUT, @MW OUTPUT

BEGIN TRAN

IF (@orgRetailPrice <> @RetailPrice) --новая цена
BEGIN
	IF EXISTS ( SELECT Id FROM CA.GoodsDocLines WHERE PartyId = @PartyId AND Id <> @intGoodsDocLineId)
	BEGIN
		IF @@trancount > 0 ROLLBACK TRAN
		SELECT @intErrCode = 7, 
		@strMsg = 'По партии с идентификатором ' + cast(@PartyId as varchar(20)) + ' было товародвижение, поэтому розничную цену менять нельзя!'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END
	UPDATE CD.Parties SET RetailPrice = @RetailPrice WHERE Id = @PartyId
END

IF @DocQntty = @FactQntty --теперь количество по документу равно фактическому количеству
BEGIN  --нужно удалить корректируещие проводки
	EXEC @intRet = dbo.[InventoryLinesTrancDelete] @Original_Id, @Original_MD
	IF @intRet <> 0 
	BEGIN
		IF @@trancount > 0 ROLLBACK TRAN
		RETURN @intRet
	END
	SET @intGoodsDocLineId = NULL

	GOTO LASTUPDATE
END

--теперь количество по документу НЕ равно количеству по факту 
IF ( (@orgDocQntty - @orgFactQntty) <> (@DocQntty - @FactQntty) )
BEGIN--новое количество
--проверить возможность изменения количества
	SET @intT = @FactQntty - @DocQntty - (@orgFactQntty - @orgDocQntty)
	EXEC @intRet = dbo.CheckPartyFlow @PartyId, @intT, @orgDocDate, @intInputCount OUTPUT, @intOutputCount OUTPUT
	IF (@intRet <> 0) 
	BEGIN
		IF @@trancount > 0 ROLLBACK TRAN
		RETURN @intRet
	END

-- надо ИЗМЕНИТЬ старую корректирующею проводку или создать новую
		IF @intGoodsDocLineId Is NUll
		BEGIN --раньше не было корректирующей проводки
--добавить новую проводку
			SET @intGoodsDocLineId = @Original_Id
			EXEC @intRet = [dbo].[InventoryLinesTrancInsert]
				@orgDocId, @GoodsId ,
				@PartyId OUTPUT,
				@DocQntty, @FactQntty, @BarCode,
				@SupplierGoodsId, @ManufacturerPrice,
				@SupplierPrice,	@SupplierSumNOTAX, @ImportMarkup, @SupplierMarkup,
				@BatchNumber,	@ReadyBefore,	@MadeDate,
				@NDSTax, @NDSValue,	@ReestrPrice,	@ReestrDate, @GTDNumber,
				@CertificateNumber,	@CertificateDate,	@CertificateOrgId,
				@RetailMarkup,@RetailPrice,
				@ContragentId, @ContragentDocDate,@ContragentDocNumber,
				@Note, @MD,	@MW,
				@intGoodsDocLineId OUTPUT

			IF @intRet <> 0 
			BEGIN
				IF @@trancount > 0 ROLLBACK TRAN
				RETURN @intRet
			END

		END ELSE BEGIN -- надо ИЗМЕНИТЬ старую корректирующею проводку 

			UPDATE [CA].[GoodsDocLines] SET Qntty = @FactQntty - @DocQntty, RetailSum =  @RetailPrice * (@FactQntty - @DocQntty)
			WHERE Id = @intGoodsDocLineId
		END --OF IF @intGoodsDocLineId Is NUll

END --OF IF ( (@orgDocQntty - @orgFactQntty) <> (@DocQntty - @FactQntty) )
	
IF (@orgDocId = @orgPartyDocId) --партия была создана по документу инвентаризации
BEGIN --проверить обновления приходной строки, созданной по документу инвентаризации 

	SET @intT = @FactQntty - @DocQntty
	EXEC @intRet = dbo.InputLinesInsertUpdate @orgDocId,@GoodsId,@intT,@SupplierGoodsId,@ManufacturerPrice,
	@SupplierPrice,@SupplierSumNOTAX,@ImportMarkup,@SupplierMarkup,@BatchNumber,@ReadyBefore,@MadeDate,
	@NDSTax,@NDSValue,@ReestrPrice,@ReestrDate,@GTDNumber,
	@CertificateNumber,@CertificateDate,@CertificateOrgId,@RetailMarkup,
	@ContragentId,@ContragentDocDate,@ContragentDocNumber,
	@Note,@MD,@MW,
	@orgInputLineId, 1, @intT OUTPUT
	IF @intRet <> 0 
	BEGIN
		IF @@trancount > 0 ROLLBACK TRAN
		RETURN @intRet
	END
END

LASTUPDATE:

	SET NOCOUNT OFF;

UPDATE CD.InventoryLines SET 
--[PartyId] = @PartyId,
GoodsDocLineId = @intGoodsDocLineId,
[DocQntty] = @DocQntty,
[FactQntty] = @FactQntty, 
[Note] = @Note, [MD] = @MD, [MW] = @MW 
WHERE Id = @Original_Id

SELECT @intErrCode = @@error, @intRowCount = @@rowcount
IF @intErrCode <> 0 
BEGIN
	IF @@trancount > 0 ROLLBACK TRAN
	RETURN @intErrCode
END
IF (@intRowCount <> 1)
BEGIN
	IF @@trancount > 0 ROLLBACK TRAN
	SELECT @intErrCode = 8, 
	@strMsg = 'Запись в таблице инвентаризации не изменена!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END
	
COMMIT TRAN

SELECT Id, DocId, GoodsId, GoodsDocLineId, PartyId, PartyDocId, InputLineId, InputLineDocId, DocQntty, FactQntty, BarCode, RetailPrice, SupplierGoodsId, 
ManufacturerPrice, SupplierPrice, ImportMarkup, SupplierMarkup, GTDNumber, NDSValue, NDSTax, RetailMarkup, BatchNumber, ReadyBefore, 
MadeDate, ReestrPrice, ReestrDate, CertificateNumber, CertificateDate, CertificateOrgId, ContragentId, ContragentDocDate, ContragentDocNumber, 
Note, MD, MW
FROM dbo.vwInventoryLines 
WHERE (Id = @Original_Id)

RETURN 0


